package utna.frba.ia.tp.cases.descifrador;

import org.jgap.Configuration;
import org.jgap.FitnessFunction;
import org.jgap.Gene;
import org.jgap.IChromosome;
import org.jgap.InvalidConfigurationException;
import org.jgap.impl.StringGene;

import utna.frba.ia.running.ExecutionCase;
import utna.frba.ia.tp.cases.descifrador.reglas.definition.Funcion;

public class DescifradorDeClaveCase extends ExecutionCase{

	public DescifradorDeClaveCase(int evolutionsAllowed, int amountToPopulate) {
		super(evolutionsAllowed, amountToPopulate);
	}

	private FuncionDeAptitudParaClaves funcionDeAptitudParaClaves = new FuncionDeAptitudParaClaves();
	
	@Override
	protected FitnessFunction getFuncionDeAptitud() {
		return funcionDeAptitudParaClaves;
	}

	@Override
	protected Gene[] getGenes(Configuration conf)throws InvalidConfigurationException {
		Gene[] sampleGenes = new Gene[12];
		
		for (int i = 0; i < sampleGenes.length; i++) {
			sampleGenes[i] = new StringGene(conf,1,1,"0123456789");
		}
		
		return sampleGenes;
	}

	@Override
	protected void presentResult(IChromosome bestSolutionSoFar) {
		System.out.println("**************************************************************************************************");
		System.out.println("Se ejecuto el algoritmo con una poblacion inicial de '" + this.getAmount_to_populate() + "', la cual se evoluciono en '" + this.getEvolutions_allowed() + "' ocasiones.");
		System.out.println("");
				
		System.out.println("Aplicando las siguientes reglas:");
		for (Funcion regla : this.funcionDeAptitudParaClaves.getReglas()) {
			System.out.println("  -> " + regla.getLiteralDefinition());
		}
		System.out.println("");
		System.out.println("Se llega a que la clave obtenida es: '" + this.funcionDeAptitudParaClaves.getLiteralValueOfResult(bestSolutionSoFar) + "'.");
		System.out.println("Resultado de la funcion de aptitud para la clave obtenida: " + this.funcionDeAptitudParaClaves.getLastComputedFitnessValue() + ".");
		
		System.out.println("");
		System.out.println("**************************************************************************************************");
	}

}
